// axios二次封装
import router from '@/router'
import { useUserStore } from '@/stores'
import axios, { AxiosError } from 'axios'
import { showToast } from 'vant'

export const baseURL = 'https://consult-api.itheima.net/'
// 创建axios实例,配置基地址和超时时间
const instance = axios.create({
  // TODO 1. 基础地址，超时时间
  baseURL,
  timeout: 5000
})
// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    // TODO 2. 携带token,将token注入请求，类型守卫判断请求头是否存在。
    const store = useUserStore()
    if (store.user?.token && config.headers) {
      config.headers.Authorization = `Bearer ${store.user?.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)
// 响应拦截器
instance.interceptors.response.use(
  // 请求成功
  (res) => {
    // TODO 3. 处理业务失败；按照后端返回的业务code多少判断业务是否失败。
    if (res.data.code != 10000) {
      // 错误提示
      showToast(res.data.message || '请求失败')
      // 返回错误的promise
      return Promise.reject(res.data)
      // 传入code,将来catch处理
    }
    // TODO 4. 摘取核心响应数据，根据后端响应的数据结构，返回响应体。
    return res.data
  },
  // 请求失败
  (err: AxiosError) => {
    // TODO 5. 处理401错误，token失效需要重新登录；登录成功后需要返回原页面。
    let message = '' //错误信息
    const status = err.request.status //请求错误状态码
    const store = useUserStore()

    switch (status) {
      case 401:
        message = 'token失效，请重新登录'
        // 清除本地用户信息
        store.delUser()
        // 携带当前页面参数并跳转到登录页
        router.push({
          path: '/login',
          query: {
            returnUrl: router.currentRoute.value.fullPath
          }
        })
        break
      case 403:
        message = '拒绝访问'
        break
      case 404:
        message = '请求地址错误'
        break
      case 500:
        message = '服务器故障'
        break
      default:
        message = '网络连接故障'
    }
    // 提示错误信息
    showToast(message)
    // 将错误promise返回，将来处理
    return Promise.reject(err)
  }
)

export default instance
